package com.example.lhh.jwt;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;

/**
 * @author luoHongHu
 * @Description JWT工具类
 * 用于生成token
 * @date 2025年03月29日 20:40
 */
public class LhhJwtUtil {
    //定义签名，解密，统一编码，到时候解密才不错
    private static final String SECRET = ("secret".getBytes(StandardCharsets.UTF_8)).toString();
    //定义失效时间（两分钟）
    private static final long ExpiresAtTime = 1000 * 60 * 1;//一分钟失效

    /**
     *
     * 创建token
     * @param username 用户名
     * @param roleList 角色集合
     * @param accessList
     * @return
     */
    public static String createToken(String username, List<String> roleList, List<String> accessList){
        Algorithm algorithm = Algorithm.HMAC256(SECRET.getBytes(StandardCharsets.UTF_8));
        return JWT.create().withAudience(username)//用户
                    .withClaim("roles", roleList)//角色
                    .withClaim("access", accessList)//认证
                    .withExpiresAt(new Date(System.currentTimeMillis() + ExpiresAtTime))//实现时间
                    .sign(algorithm);//签名算法
    }

    public static Claims parseJwt(String token){
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET.getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return claims;
    }

    /**
     * 验证token 是否和创建的一样
     * @param token
     * @return
     */
    public static boolean verifyToken(String token){
        try{
            Algorithm algorithm = Algorithm.HMAC256(SECRET.getBytes(StandardCharsets.UTF_8));
            JWTVerifier verifier = JWT.require(algorithm).build();
            verifier.verify(token);
            return true;
        } catch (Exception e) {
            throw new RuntimeException("token不一致");
        }
    }

    /**
     * 判断token是否过期
     * @param token
     */
    /**
     * 判断是否过期
     */
    public static boolean isExpire(String token) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getExpiresAt().getTime() < System.currentTimeMillis();
    }

    /**
     * 获取token里面的用户信息
     * @param token
     * @return
     */
    public static String getUsername(String token) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("username").asString();
    }

    public static void main(String[] args) {
        List<String> roleList = null;
        List<String> accessList = null;
        String token = createToken("admin",roleList,  accessList);
        verifyToken("token.eeee.222");
    }
}
